package com.example.showlocation;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.view.View;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.animation.DecelerateInterpolator;

import androidx.appcompat.app.AppCompatActivity;

import com.tencent.tencentmap.mapsdk.maps.CameraUpdate;
import com.tencent.tencentmap.mapsdk.maps.CameraUpdateFactory;
import com.tencent.tencentmap.mapsdk.maps.TencentMap;
import com.tencent.tencentmap.mapsdk.maps.TencentMapInitializer;
import com.tencent.tencentmap.mapsdk.maps.TextureMapView;
import com.tencent.tencentmap.mapsdk.maps.model.AnimationListener;
import com.tencent.tencentmap.mapsdk.maps.model.BitmapDescriptorFactory;
import com.tencent.tencentmap.mapsdk.maps.model.CameraPosition;
import com.tencent.tencentmap.mapsdk.maps.model.IAlphaAnimation;
import com.tencent.tencentmap.mapsdk.maps.model.IEmergeAnimation;
import com.tencent.tencentmap.mapsdk.maps.model.LatLng;
import com.tencent.tencentmap.mapsdk.maps.model.Polyline;
import com.tencent.tencentmap.mapsdk.maps.model.PolylineOptions;

import java.util.ArrayList;
import java.util.List;

public class PolylineActivity extends AppCompatActivity {
    TextureMapView textureMapView;
    TencentMap mTencentMap;
    Polyline polyline;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_polyline);
        TencentMapInitializer.setAgreePrivacy(true);
        textureMapView=(TextureMapView)findViewById(R.id.view3) ;
        mTencentMap = textureMapView.getMap();
    }
    @SuppressLint("IntentReset")
    public void addPolyline(View view){
// 构造折线点串
        List<LatLng> latLngs = new ArrayList<LatLng>();
        latLngs.add(new LatLng(39.984864,116.305756));
        latLngs.add(new LatLng(39.983618,116.305848));
        latLngs.add(new LatLng(39.982347,116.305966));
        latLngs.add(new LatLng(39.982412,116.308111));
        latLngs.add(new LatLng(39.984122,116.308224));
        latLngs.add(new LatLng(39.984955,116.308099));

// 构造 PolylineOpitons
        PolylineOptions polylineOptions = new PolylineOptions()
                .addAll(latLngs)
                // 折线设置圆形线头
                .lineCap(true)
                // 折线的颜色为绿色
                .color(0xff00ff00)
                // 折线宽度为25像素
                .width(25)
                // 还可以添加描边颜色
                .borderColor(0xffff0000)
                // 描边颜色的宽度，线宽还是 25 像素，不过填充的部分宽度为 `width` - 2 * `borderWidth`
                .borderWidth(5);

// 绘制折线
        Polyline polyline = mTencentMap.addPolyline(polylineOptions);
        /*List<Integer> pattern = new ArrayList<>();
        pattern.add(35);
        pattern.add(20);
        polyline.pattern(pattern);*/
        LatLng position = new LatLng(39.982347,116.305966);
        CameraUpdate cameraSigma =
                CameraUpdateFactory.newCameraPosition(new CameraPosition(position
                        , //中心点坐标，地图目标经纬度
                        19,  //目标缩放级别
                        0f, //目标倾斜角[0.0 ~ 45.0] (垂直地图时为0)
                        0f)); //目标旋转角 0~360° (正北方为0)
        mTencentMap.moveCamera(cameraSigma);
// 将地图视野移动到折线所在区域(指定西南坐标和东北坐标)，设置四周填充的像素
        /*mTencentMap.moveCamera(CameraUpdateFactory.newLatLngBounds(
                new LatLngBounds.Builder()
                        .include(getLatlons()).build(),
                100));*/
    }
    @SuppressLint("IntentReset")
    public void addPolyline_pattern(View view){
        List<LatLng> latLngs = new ArrayList<LatLng>();
        latLngs.add(new LatLng(39.984864,116.305756));
        latLngs.add(new LatLng(39.983618,116.305848));
        latLngs.add(new LatLng(39.982347,116.305966));
        latLngs.add(new LatLng(39.982412,116.308111));
        latLngs.add(new LatLng(39.984122,116.308224));
        latLngs.add(new LatLng(39.984955,116.308099));
        // 构造 PolylineOpitons
        PolylineOptions polylineOptions = new PolylineOptions()
                .addAll(latLngs)
                // 折线宽度为15像素
                .width(15);

// 设置虚线模式
        List<Integer> pattern = new ArrayList<>();
        pattern.add(35);
        pattern.add(20);
        polylineOptions.pattern(pattern);

        Polyline polyline = mTencentMap.addPolyline(polylineOptions);
        LatLng position = new LatLng(39.982347,116.305966);
        CameraUpdate cameraSigma =
                CameraUpdateFactory.newCameraPosition(new CameraPosition(position
                        , //中心点坐标，地图目标经纬度
                        19,  //目标缩放级别
                        0f, //目标倾斜角[0.0 ~ 45.0] (垂直地图时为0)
                        0f)); //目标旋转角 0~360° (正北方为0)
        mTencentMap.moveCamera(cameraSigma);
    }
    @SuppressLint("IntentReset")
    public void addPolyline_Shadow(View view){
        List<LatLng> latLngs = new ArrayList<LatLng>();
        latLngs.add(new LatLng(39.984864,116.305756));
        latLngs.add(new LatLng(39.983618,116.305848));
        latLngs.add(new LatLng(39.982347,116.305966));
        latLngs.add(new LatLng(39.982412,116.308111));
        latLngs.add(new LatLng(39.984122,116.308224));
        latLngs.add(new LatLng(39.984955,116.308099));
        /*// 构造 PolylineOpitons
        PolylineOptions polylineOptions = new PolylineOptions()
                .addAll(latLngs)
                // 折线设置圆形线头
                .lineCap(true)
                // 纹理颜色
                .color(PolylineOptions.Colors.GRAYBLUE)
                .width(25);*/
       /* PolylineOptions polylineOptions = new PolylineOptions()
                .addAll(latLngs)
                // 折线设置圆形线头
                .lineCap(true)
                //设置用户自己的纹理，此例中我们的纹理放在了工程的 assets 目录
                .colorTexture(BitmapDescriptorFactory
                        .fromAsset("map_dn.png"))
                //使用我们纹理图片的第三行像素填充线的每个像素截面
                .color(23);
// 绘制折线
        Polyline polyline = mTencentMap.addPolyline(polylineOptions);*/
        // 设置线路绘制类型为点，自定义点的纹理
        /*Polyline polyline = mTencentMap.addPolyline(
                new PolylineOptions()
                        .addAll(latLngs)
                        // 线路绘制类型
                        .lineType(PolylineOptions.LineType.LINE_TYPE_DOTTEDLINE)
                        // 设置图片作为线的填充纹理
                        .colorTexture(BitmapDescriptorFactory.
                                fromAsset("icon.png"))
                        .width(25)
);*/
        // 构造 PolylineOpitons
        PolylineOptions polylineOptions = new PolylineOptions()
                .addAll(latLngs)
                // 折线设置圆形线头
                .lineCap(true)
                // 折线的颜色为绿色
                .color(0xff00ff00)
                // 折线宽度为25像素
                .width(25)
                // 必须打开这个开关，允许在线上绘制纹理
                .arrow(true)
        // 支持设置纹理的间距
        .arrowSpacing(30)
        // 设置纹理图片
        .arrowTexture(
                BitmapDescriptorFactory
                        .fromAsset("map_dn.jpg"));;

// 绘制折线
        Polyline polyline = mTencentMap.addPolyline(polylineOptions);
        LatLng position = new LatLng(39.982347,116.305966);
        CameraUpdate cameraSigma =
                CameraUpdateFactory.newCameraPosition(new CameraPosition(position
                        , //中心点坐标，地图目标经纬度
                        19,  //目标缩放级别
                        0f, //目标倾斜角[0.0 ~ 45.0] (垂直地图时为0)
                        0f)); //目标旋转角 0~360° (正北方为0)
        mTencentMap.moveCamera(cameraSigma);
    }
    @SuppressLint("IntentReset")
    public void addPolyline_indexes(View view){
        List<LatLng> latLngs = new ArrayList<LatLng>();
        latLngs.add(new LatLng(39.984864,116.305756));
        latLngs.add(new LatLng(39.983618,116.305848));
        latLngs.add(new LatLng(39.982347,116.305966));
        latLngs.add(new LatLng(39.982412,116.308111));
        latLngs.add(new LatLng(39.984122,116.308224));
        latLngs.add(new LatLng(39.984955,116.308099));

// 设置分段线的顶点索引，这个索引值的数量必须和下面的颜色列表数量相同
        int[] indexes = {0,1,2,3,4};
// 设置每段索引之间的颜色，这个颜色同样支持纹理颜色，即 PolylineOptions.Colors 中定义的 [0, 10] 值
        int[] colors = {
                0xff00ff00, // 线上点 [0, 1] 之间为绿色
                0xffffff00, // 线上点 [1, 2] 之间为黄色
                0xffff0000, // 线上点 [2, 3] 之间为红色
                0xffffff00, // 线上点 [3, 4] 之间为黄色
                0xff00ff00  // 线上点 [4, 最后一个点] 之间为绿色
        };

// 构造 PolylineOpitons
        PolylineOptions polylineOptions = new PolylineOptions()
                .addAll(latLngs)
                .lineCap(true)
                .width(15f)
                //设置彩虹线的颜色
                .colors(colors, indexes);
        mTencentMap.addPolyline(polylineOptions).setGradientEnable(true);


        LatLng position = new LatLng(39.982347,116.305966);
        CameraUpdate cameraSigma =
                CameraUpdateFactory.newCameraPosition(new CameraPosition(position
                        , //中心点坐标，地图目标经纬度
                        19,  //目标缩放级别
                        0f, //目标倾斜角[0.0 ~ 45.0] (垂直地图时为0)
                        0f)); //目标旋转角 0~360° (正北方为0)
        mTencentMap.moveCamera(cameraSigma);
    }
    @SuppressLint("IntentReset")
    public void addPolyline_erase(View view){
        List<LatLng> latLngs = new ArrayList<LatLng>();
        latLngs.add(new LatLng(39.984864,116.305756));
        latLngs.add(new LatLng(39.983618,116.305848));
        latLngs.add(new LatLng(39.982347,116.305966));
        latLngs.add(new LatLng(39.982412,116.308111));
        latLngs.add(new LatLng(39.984122,116.308224));
        latLngs.add(new LatLng(39.984955,116.308099));
        /*PolylineOptions polylineOptions = new PolylineOptions()
                .addAll(latLngs)
                // 折线宽度为15像素
                .width(15);

        Polyline polyline = mTencentMap.addPolyline(polylineOptions);
// 必须设置 `true`，默认为 `false`
        polyline.setEraseable(true);
//其中第一个参数表示要擦除到的坐标索引 `index`
// 第二个参数表示从 [`index -1`, `index`] 之间的坐标
// 如果这个坐标不在擦除的索引范围内，会一直擦除到 `index`
        polyline.eraseTo(1, new LatLng(39.983919,116.305722));*/
        PolylineOptions polylineOptions = new PolylineOptions()
                .addAll(latLngs)
                // 折线设置圆形线头
                .lineCap(true)
                // 折线的颜色为绿色
                .color(0xff00ff00)
                // 折线宽度为25像素
                .width(25)
                // 设置擦除颜色为灰色
                .eraseColor(0xff999999);

        Polyline polyline = mTencentMap.addPolyline(polylineOptions);
// 必须设置 `false`，默认为 `true`
        polyline.setEraseable(false);
//其中第一个参数表示要擦除到的坐标索引 `index`
// 第二个参数表示从 [`index -1`, `index`] 之间的坐标
// 如果这个坐标不在擦除的索引范围内，会一直擦除到 `index`
        polyline.eraseTo(1, new LatLng(39.983919,116.305722));
        LatLng position = new LatLng(39.982347,116.305966);
        CameraUpdate cameraSigma =
                CameraUpdateFactory.newCameraPosition(new CameraPosition(position
                        , //中心点坐标，地图目标经纬度
                        19,  //目标缩放级别
                        0f, //目标倾斜角[0.0 ~ 45.0] (垂直地图时为0)
                        0f)); //目标旋转角 0~360° (正北方为0)
        mTencentMap.moveCamera(cameraSigma);
    }
    @SuppressLint("IntentReset")
    public void addPolyline_segmentTexts(View view){
        List<LatLng> latLngs = new ArrayList<LatLng>();
        latLngs.add(new LatLng(39.984864,116.305756));
        latLngs.add(new LatLng(39.983618,116.305848));
        latLngs.add(new LatLng(39.982347,116.305966));
        latLngs.add(new LatLng(39.982412,116.308111));
        latLngs.add(new LatLng(39.984122,116.308224));
        latLngs.add(new LatLng(39.984955,116.308099));

        PolylineOptions polylineOptions = new PolylineOptions()
                .addAll(latLngs)
                // 折线设置圆形线头
                .lineCap(true)
                // 折线的颜色为绿色
                .color(0xff00ff00)
                // 折线宽度为25像素
                .width(25)
                // 设置文字
                .text(createText());

         polyline = mTencentMap.addPolyline(polylineOptions);
        LatLng position = new LatLng(39.982347,116.305966);
        CameraUpdate cameraSigma =
                CameraUpdateFactory.newCameraPosition(new CameraPosition(position
                        , //中心点坐标，地图目标经纬度
                        19,  //目标缩放级别
                        0f, //目标倾斜角[0.0 ~ 45.0] (垂直地图时为0)
                        0f)); //目标旋转角 0~360° (正北方为0)
        mTencentMap.moveCamera(cameraSigma);
    }
    @SuppressLint("IntentReset")
    public void addPolyline_Animation(View view){
        List<LatLng> latLngs = new ArrayList<LatLng>();
        latLngs.add(new LatLng(39.984864,116.305756));
        latLngs.add(new LatLng(39.983618,116.305848));
        latLngs.add(new LatLng(39.982347,116.305966));
        latLngs.add(new LatLng(39.982412,116.308111));
        latLngs.add(new LatLng(39.984122,116.308224));
        latLngs.add(new LatLng(39.984955,116.308099));
        Polyline polyline = mTencentMap.addPolyline(new PolylineOptions().addAll(latLngs));


                // 添加折线动画
                IAlphaAnimation alphaAnimation1 = mTencentMap.getMapContext().createAlphaAnimation(0.1f, 1);
                alphaAnimation1.setDuration(1500);
                alphaAnimation1.setInterpolator(new AccelerateDecelerateInterpolator());
                alphaAnimation1.setAnimationListener(new AnimationListener() {
                    @Override
                    public void onAnimationStart() {

                    }

                    @Override
                    public void onAnimationEnd() {
                        // AlphaAnimation动画结束后，显示EmergeAnimation动画
                        IEmergeAnimation emergeAnimation = mTencentMap.getMapContext().createEmergeAnimation(polyline.getPoints().get(polyline.getPoints().size() / 2));
                        emergeAnimation.setDuration(2500);
                        emergeAnimation.setInterpolator(new DecelerateInterpolator());
                        polyline.startAnimation(emergeAnimation);
                    }
                });
                if (polyline != null) {
                    // AlphaAnimation动画
                    polyline.startAnimation(alphaAnimation1);
                }



        LatLng position = new LatLng(39.982347,116.305966);
        CameraUpdate cameraSigma =
                CameraUpdateFactory.newCameraPosition(new CameraPosition(position
                        , //中心点坐标，地图目标经纬度
                        19,  //目标缩放级别
                        0f, //目标倾斜角[0.0 ~ 45.0] (垂直地图时为0)
                        0f)); //目标旋转角 0~360° (正北方为0)
        mTencentMap.moveCamera(cameraSigma);
    }
    @SuppressLint("IntentReset")
    public void addPolyline_appendPoints(View view){
        List<LatLng> latLngs = new ArrayList<LatLng>();
        latLngs.add(new LatLng(39.984864,116.305756));
        latLngs.add(new LatLng(39.983618,116.305848));
        latLngs.add(new LatLng(39.982347,116.305966));
        latLngs.add(new LatLng(39.982412,116.308111));
        latLngs.add(new LatLng(39.984122,116.308224));
        latLngs.add(new LatLng(39.984955,116.308099));
         polyline = mTencentMap.addPolyline(new PolylineOptions().addAll(latLngs));


        // 添加折线动画




        LatLng position = new LatLng(39.982347,116.305966);
        CameraUpdate cameraSigma =
                CameraUpdateFactory.newCameraPosition(new CameraPosition(position
                        , //中心点坐标，地图目标经纬度
                        19,  //目标缩放级别
                        0f, //目标倾斜角[0.0 ~ 45.0] (垂直地图时为0)
                        0f)); //目标旋转角 0~360° (正北方为0)
        mTencentMap.moveCamera(cameraSigma);
    }
    @SuppressLint("IntentReset")
    public void appendPoints(View view){
        //添加需要更新的点集
        /*List<LatLng> listPoints = new ArrayList<LatLng>();
        listPoints.add(new LatLng(39.981787, 116.306649));
        listPoints.add(new LatLng(39.982021, 116.306739));
        listPoints.add(new LatLng(39.982351, 116.306883));
        listPoints.add(new LatLng(39.98233, 116.306047));
        listPoints.add(new LatLng(39.982324, 116.305867));
        listPoints.add(new LatLng(39.981918, 116.305885));
        listPoints.add(new LatLng(39.981298, 116.305921));
        listPoints.add(new LatLng(39.981091, 116.305939));
        listPoints.add(new LatLng(39.980506, 116.305975));
        listPoints.add(new LatLng(39.980148, 116.306002));
        //在原有顶点上附加新的顶点
       polyline.appendPoints(listPoints );*/
        polyline.remove();
    }

    public PolylineOptions.Text createText() {
        List<PolylineOptions.SegmentText> segmentTexts = new ArrayList<>();
// SegmentText的三个参数分别为起点在数组中的下标，终点在数组中的下标，以及要显示的文字
        segmentTexts.add(new PolylineOptions.SegmentText(0, 2, "苏州街"));
        segmentTexts.add(new PolylineOptions.SegmentText(2, 3, "海淀大街"));
        segmentTexts.add(new PolylineOptions.SegmentText(3, 5, "彩和坊路"));
        return new PolylineOptions.Text.Builder(segmentTexts).build();
    }


}